from flask import Flask
from flask_sqlalchemy import SQLAlchemy

"""

    flask-sqlalchemy 介绍与安装

     pip install -U Flask-SQLalchemy
    源码安装 python setup.py install

    安装mysql驱动依赖
    pip install mysqlclient / brew install mysql-client

    flask-sqlalchemy配置
    数据库URI SQLALCHEMY_DATABASE_URI
    统一资源标识符 是一个用于标识某一互联网资源名称的字符串

    MySQL数据库URI参数格式
    mysql://scott:tiger@localhost/mydatabase
    数据库类型://用户:密码@主机/数据库名称

    多个数据库的支持
    SQLALCHEMY_BINDS = {
        'db1': 'mysqldb://localhost/users',
        'db2': 'sqlite:////path/to/appmeta.db'
    }

    绑定到Flask对象
    db = SQLAlchemy(app)

    ORM模型创建
    class User(db.Model):
        id = db.Column(db.Integer, primary_key=True)
    指定表名称
        _tablename_ = 'user'

    手动创建数据库
    创建表
        >>> db.create_all(bind='db1')
    删除表
        >>> db.drop_all()
    添加数据
        >>> user = User(id=1, username='zhangsan')
        >>> db.session.add(user)
        >>> db.session.commit()
    删除数据
        >>> db.session.delete(user)
        >>> db.session.commit()
    
    返回结果集
        查询所有数据
            User.query.all()
        按条件查询
            User.query.filter_by(id=1)
            User.query.filter(User.nickname.endswith('san')).all()
        排序
            User.query.order_by(User.username)
        查询TOP10
            User.query.limit(10).all()

    返回单个ORM对象
        根据pk查询 User.query.get(1)  | db.session.get(User,1)
        获取第一条记录 User.query.first()
        视图快捷函数：有则返回，无则返回404
            first() vs first_or_404()
            get() vs get_or_404()
        多表联查
            db.session.query(User).join(Address)
            db.query.join(Address)
    
    分页
        使用offset和limit
            .offset(offset)
            .limit(limit)
            User.query.offset(5).limit(10).all()
            
        paginate分页支持
            pagination = User.query.paginate(page,per_page) 返回Pagination的对象
            # pagination = User.query.paginate(page=2,per_page=10)
            pagination.has_prev/has_next 是否有上一页或下一页
            pagination.items   当前页的数据列表
            pagination.prev_num / next_num 上一页/下一页页码
            pagination.totol 总记录数
            pagination.pages总页数
        
"""
application = Flask(__name__)
application.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@localhost/test_flask'
application.app_context().push()
db = SQLAlchemy(application)


class User(db.Model):
    __tablename__ = 'weibo_user'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), nullable=False)
    password = db.Column(db.String(256), nullable=False)
    birth_date = db.Column(db.DateTime, nullable=True)
    age = db.Column(db.Integer, default=0)


class UserAddress(db.Model):
    """用户地址"""
    __tablename__ = 'weibo_user_addr'
    id = db.Column(db.Integer, primary_key=True)
    addr = db.Column(db.String(256), nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('weibo_user.id'), nullable=False)
    user = db.relationship('User', backref=db.backref('address', lazy=True))


"""
user = User()
user.address
addr = UserAddress()
addr.user
"""

# with app.app_context():
#     db.drop_all()
#     db.create_all()
#     print("表创建成功！")

# if __name__ == '__main__':
#     app.run(debug=True)